package cn.sxt.yxl.question.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import cn.sxt.yxl.common.util.ConstatFinalUtil;
import cn.sxt.yxl.common.util.MutliThreadUtil;
import cn.sxt.yxl.common.util.YxlSpiderUtil;
import cn.sxt.yxl.question.pojo.AColumns;
import cn.sxt.yxl.question.pojo.AColumnsEnum;
import cn.sxt.yxl.question.pojo.AItems;
import cn.sxt.yxl.question.service.IQuestionService;
import cn.sxt.yxl.question.service.IQuestionSpiderService;

/**
 * 实现类的代码
 * @author wangshSxt
 *
 */
@Service("questionSpiderService")
public class QuestionSpiderServiceImpl implements IQuestionSpiderService
{
	/*@Resource
	private IAColumnsDao columnsDao;*/
	@Resource
	private IQuestionService questionService;
	
	/**
	 * ~查询指定或者所有的栏目
	 * ~查询栏目下面对应的测试项(采集数据)
	 * ~将采集的数据存储到数据库中 
	 */
	public JSONObject saveBatchItemsServiceBak(String url)
	{
		ConstatFinalUtil.LOGGER.info("--saveBatchItemsService--");
		JSONObject resultJSON = new JSONObject() ; 
		Map<String, Object> condMap = new HashMap<String, Object>() ; 
		
		List<AColumns> columnList = new ArrayList<AColumns>();
		/*查询指定或者所有的栏目*/
		if(url == null || "".equalsIgnoreCase(url))
		{
			/* 木有传递url,查询所有的栏目 
			 * 只抓取启用的栏目
			 * */
			condMap.put("status", AColumnsEnum.STATUS_ENABLE.getStatus());
			columnList = this.questionService.findCondListColumnsService(null, condMap);
		}else
		{
			/* 传递了url */
			condMap.put("url", url);
			AColumns columns = this.questionService.findOneColumnsService(condMap);
			columnList.add(columns);
		}
		
		/* 查询栏目下面对应的测试项(采集数据) */
		for (Iterator iterator = columnList.iterator(); iterator.hasNext();)
		{
			AColumns columns = (AColumns) iterator.next();
			ConstatFinalUtil.LOGGER.info("--正在抓取栏目:{},url:{}--",columns.getName(),columns.getUrl());
			YxlSpiderUtil yxlSpiderUtil = new YxlSpiderUtil() ; 
			JSONObject itemsResJSON = yxlSpiderUtil.itemsList(columns.getUrl(),1);
			/* 分页采集数据 */
			/* 第一次查询只查询总页数 */
			if("0".equalsIgnoreCase(itemsResJSON.getString("code")))
			{
				/* 可以正常的采集 */
				JSONObject itemsResDataJSON = itemsResJSON.getJSONObject("data");
				/* 取总页数 */
				int totalPage = itemsResDataJSON.getIntValue("totalPage");
				/* 分页采集数据 */
				/*for(int i = 1 ; i <= totalPage; i ++)*/
				for(int i = 1 ; i <= 1; i ++)
				{
					ConstatFinalUtil.LOGGER.info("--正在抓取栏目:{},url:{};页数:{};总页数:{}--",columns.getName(),columns.getUrl(),i,totalPage);
					/* 采集当前页的数据 */
					itemsResJSON = yxlSpiderUtil.itemsList(columns.getUrl(), i);
					if("0".equalsIgnoreCase(itemsResJSON.getString("code")))
					{
						itemsResDataJSON = itemsResJSON.getJSONObject("data");
						JSONArray itemsArr = itemsResDataJSON.getJSONArray("itemsList");
						for (Iterator iterator2 = itemsArr.iterator(); iterator2.hasNext();)
						{
							JSONObject jsonTemp = (JSONObject) iterator2.next();
							/* 壹心理网站的id */
							int outId = jsonTemp.getIntValue("id") ; 
							
							/* 根据outerId查询测试项 */
							condMap.clear();
							condMap.put("outId", outId);
							AItems items = this.questionService.findOneItemsService(condMap);
							
							/* 断言,(假设:是不知道结果,只是一个假设)数据库存在 */
							boolean update = true ; 
							if(items == null)
							{
								/* 不存在 */
								items = new AItems() ; 
								items.setCreateTime(new Date());
								update = false ; 
							}
							
							/* 肯定能够知道结果(upflag) */
							
							/* 拼装Aitems */
							items.setName(jsonTemp.getString("name"));
							items.setContent("");
							items.setOutId(outId);
							items.setImgPath(jsonTemp.getString("imgPath"));
							/* 一定要把状态修改为禁用 */
							items.setUpdateTime(new Date());
							items.setPubTime(new Date());
							
							/* 
							 * 如果outerId存在,就更新,
							 * 如果不outerId不存在,就添加记录
							 *  */
							if(update)
							{
								/* 更新 */
								this.questionService.updateOneItemsService(items);
							}else
							{
								/* 保存 */
								resultJSON = this.questionService.saveOneItemsService(items);
							}
						}
					}
				}
			}
		}
		return resultJSON;
	}

	public JSONObject saveBatchItemsService(String url)
	{
		ConstatFinalUtil.LOGGER.info("--saveBatchItemsService--");
		JSONObject resultJSON = new JSONObject() ; 
		Map<String, Object> condMap = new HashMap<String, Object>() ; 
		
		List<AColumns> columnList = new ArrayList<AColumns>();
		/*查询指定或者所有的栏目*/
		if(url == null || "".equalsIgnoreCase(url))
		{
			/* 木有传递url,查询所有的栏目 
			 * 只抓取启用的栏目
			 * */
			condMap.put("status", AColumnsEnum.STATUS_ENABLE.getStatus());
			columnList = this.questionService.findCondListColumnsService(null, condMap);
			
			List<MutliThreadUtil> threadList = new ArrayList<MutliThreadUtil>();
			/* 查询栏目下面对应的测试项(采集数据) */
			for (Iterator iterator = columnList.iterator(); iterator.hasNext();)
			{
				AColumns columns = (AColumns) iterator.next();
				
				/* 创建线程 */
				MutliThreadUtil mutliThreadUtil = new MutliThreadUtil("");
				Map<String, Object> paramsMap = new HashMap<String,Object>();
				paramsMap.put("operType", "spliderColumns");
				paramsMap.put("url", columns.getUrl());
				paramsMap.put("questionSpiderService", this);
				mutliThreadUtil.setParamsMap(paramsMap);
				
				threadList.add(mutliThreadUtil);
			}
			
			/* 启用多线程 */
			ExecutorService executorService = Executors.newFixedThreadPool(threadList.size());
			try
			{
				/* 新版本特性:
				 * 主线程等待其它线程执行完
				 *  */
				executorService.invokeAll(threadList);
				/* 相当于JAVASE之前的多线程
				 * 主线程不等待 */
				/*for (Iterator iterator = threadList.iterator(); iterator.hasNext();)
				{
					MutliThreadUtil mutliThreadUtil = (MutliThreadUtil) iterator.next();
					executorService.submit(mutliThreadUtil);
				}*/
			} catch (Exception e)
			{
			}finally
			{
				executorService.shutdown();
			}
		}else
		{
			/* 传递了url */
			condMap.put("url", url);
			AColumns columns = this.questionService.findOneColumnsService(condMap);
			this.spliderColumns(columns);
		}
		return resultJSON;
	}

	/**
	 * 抓取栏目下面的信息
	 * @param columns
	 */
	private void spliderColumns(AColumns columns)
	{
		Map<String, Object> condMap = new HashMap<String, Object>();
		ConstatFinalUtil.LOGGER.info("--正在抓取栏目:{},url:{}--",columns.getName(),columns.getUrl());
		YxlSpiderUtil yxlSpiderUtil = new YxlSpiderUtil() ; 
		JSONObject itemsResJSON = yxlSpiderUtil.itemsList(columns.getUrl(),1);
		/* 分页采集数据 */
		/* 第一次查询只查询总页数 */
		if("0".equalsIgnoreCase(itemsResJSON.getString("code")))
		{
			/* 可以正常的采集 */
			JSONObject itemsResDataJSON = itemsResJSON.getJSONObject("data");
			/* 取总页数 */
			int totalPage = itemsResDataJSON.getIntValue("totalPage");
			/* 分页采集数据 */
			/*for(int i = 1 ; i <= totalPage; i ++)*/
			for(int i = 1 ; i <= 1; i ++)
			{
				ConstatFinalUtil.LOGGER.info("--正在抓取栏目:{},url:{};页数:{};总页数:{}--",columns.getName(),columns.getUrl(),i,totalPage);
				/* 采集当前页的数据 */
				itemsResJSON = yxlSpiderUtil.itemsList(columns.getUrl(), i);
				if("0".equalsIgnoreCase(itemsResJSON.getString("code")))
				{
					itemsResDataJSON = itemsResJSON.getJSONObject("data");
					JSONArray itemsArr = itemsResDataJSON.getJSONArray("itemsList");
					for (Iterator iterator2 = itemsArr.iterator(); iterator2.hasNext();)
					{
						JSONObject jsonTemp = (JSONObject) iterator2.next();
						/* 壹心理网站的id */
						int outId = jsonTemp.getIntValue("id") ; 
						
						/* 根据outerId查询测试项 */
						condMap.clear();
						condMap.put("outId", outId);
						AItems items = this.questionService.findOneItemsService(condMap);
						
						/* 断言,(假设:是不知道结果,只是一个假设)数据库存在 */
						boolean update = true ; 
						if(items == null)
						{
							/* 不存在 */
							items = new AItems() ; 
							items.setCreateTime(new Date());
							update = false ; 
						}
						
						/* 肯定能够知道结果(upflag) */
						
						/* 拼装Aitems */
						items.setName(jsonTemp.getString("name"));
						items.setContent("");
						items.setOutId(outId);
						items.setImgPath(jsonTemp.getString("imgPath"));
						/* 一定要把状态修改为禁用 */
						items.setUpdateTime(new Date());
						items.setPubTime(new Date());
						
						/* 
						 * 如果outerId存在,就更新,
						 * 如果不outerId不存在,就添加记录
						 *  */
						if(update)
						{
							/* 更新 */
							this.questionService.updateOneItemsService(items);
						}else
						{
							/* 保存 */
							this.questionService.saveOneItemsService(items);
						}
					}
				}
			}
		}
	}

}
